如果你没有源代码,那么你可以使用Qemu模式来对二进制文件进行模糊测试:
$ sudo ./build_qemu_support.sh
它将诉说缺少一些依赖性,所以我们需要安装以下软件包:
$ sudo apt install libtool-bin
$ sudo apt install bison
$ sudo apt install libglib2.0-dev
然后再次运行:
$ sudo ./build_qemu_support.sh
但最新版本的qemu有一些错误,所以构建脚本又会失败。打开./build_qemu_support.sh,寻找以下内容:
tar xf "$ARCHIVE" || exit 1
将其改为以下内容,以避免解包失败:
tar xf "$ARCHIVE" --exclude qemu-2.10.0/roms/u-boot/scripts/Kconfig || exit 1
之后再次运行:
$ sudo ./build_qemu_support.sh
再次构建将失败,出现以下错误:
254 | _syscall0(int, gettid)
| ^~~~~~
TOPDIR/tmp/work/x86_64-linux/qemu-native/3.1.0-r0/qemu-3.1.0/linux-user/syscall.c:185:13: note: in definition of macro ‘_syscall0'
185 | static type name (void) \
| ^~~~
为此,我们需要使用一个hack,打开qemu/linux-user/syscall.c文件,在第191和265行分别查找以下内容:
static type name (void)
static int gettid
只需删除静态的,并将其改为以下内容:
type name (void)
int gettid
之后,再次运行构建脚本:
$ sudo ./build_qemu_support.sh
它将需要一些时间来编译,编译应该会成功。之后,进入AFL目录并安装:
$ AFL/qemu_mode# cd ..
$ sudo make install
这将安装afl-qemu-trace,这是使用qemu模式所需要的。 你已经安装完毕。现在让我们用gcc编译我们的C程序,输入以下命令:
gcc imgRead.c -o imgRead_qemu
之后,让我们在Qemu模式下进行模糊测试,我们需要为它提供选项-Q:
afl-fuzz -Q -i in/ -o out/ -- ./imgRead_qemu
你应该能看到af模糊测试的画面。